package com.atguigu.gmall.user.controller;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.constant.RedisConst;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.common.util.IpUtil;
import com.atguigu.gmall.model.user.UserInfo;
import com.atguigu.gmall.user.service.UserInfoService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @Description:
 * @author: JC
 * @date: 2021/11/2 9:10
 */
@RestController
@RequestMapping("/api/user/passport")
public class PassportApiController {

    @Autowired
    private UserInfoService userInfoService;

    @Autowired
    private RedisTemplate redisTemplate;

    @PostMapping("login")
    public Result login(@RequestBody UserInfo userInfo, HttpServletRequest request){
        // 登录成功需要生产token 页面需要获取
        UserInfo loginUserInfo = userInfoService.login(userInfo);

        if(loginUserInfo != null){
            // 登录成功 设置一个token
            String token = UUID.randomUUID().toString();

            // 确认数据类型以及key user:login:uuid123123
            String userKey = RedisConst.USER_LOGIN_KEY_PREFIX + token;
            // 缓存中到底要存储什么？ info{有点多}info.getId(); 只存储用户Id
            // 为了防止别人伪造token做登录！ 此时存储，需要存储一个Ip 地址
            // 获取放弃的服务器的Ip地址
            String ip = IpUtil.getIpAddress(request);

            // 定义一个JsonObject 对象
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("userId", loginUserInfo.getId().toString());
            jsonObject.put("ip", ip);

            redisTemplate.opsForValue().set(userKey,jsonObject,7, TimeUnit.DAYS);


            HashMap<Object, Object> hashMap = new HashMap<>();
            hashMap.put("token",token);
            hashMap.put("nickName",loginUserInfo.getNickName());

            // 将map 中的数据返回给前台页面
            return Result.ok(hashMap);
        }

        return Result.fail("登录失败！");
    }

     @GetMapping("logout")
    public Result logout(HttpServletRequest request){
        // 删除对应的数据 cookie 客户端有js删除了，服务端删除redis中的就行

         String uuid = request.getHeader("token");
         if(!StringUtils.isEmpty(uuid)){
             String userKey = RedisConst.USER_LOGIN_KEY_PREFIX + uuid;
             redisTemplate.delete(userKey);
         }

         /*
         Cookie[] cookies = request.getCookies();
         for (Cookie cookie : cookies) {
             if(StringUtils.equals(cookie.getName(),"token")){
                 String uuid = cookie.getValue();
                 String userKey = RedisConst.USER_LOGIN_KEY_PREFIX + uuid;
                 redisTemplate.delete(userKey);
             }
         }*/
         return Result.ok();
     }
}
